From e079601dad7a824a54be138e9c981e0314aefd57 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 13 Feb 2020 17:47:20 +0100 Subject: [PATCH] Steps towards better notifications Signed-off-by: Mario Danic --- .../online/NextcloudTalkRepositoryImpl.kt | 22 +++++++--- .../newarch/data/source/remote/ApiService.kt | 11 +++++ .../talk/newarch/di/module/NetworkModule.kt | 6 +++ .../domain/di/module/UseCasesModule.kt | 13 ++++++ .../online/NextcloudTalkRepository.kt | 4 ++ .../domain/usecases/GetNotificationUseCase.kt | 39 ++++++++++++++++ .../domain/usecases/GetPeersForCallUseCase.kt | 39 ++++++++++++++++ .../talk/newarch/utils/NetworkUtils.kt | 1 + .../utils/NextcloudRepositoryWithNoCookies.kt | 44 +++++++++++++++++++ .../nextcloud/talk/utils/NotificationUtils.kt | 4 +- 10 files changed, 175 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetNotificationUseCase.kt create mode 100644 app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetPeersForCallUseCase.kt create mode 100644 app/src/main/java/com/nextcloud/talk/newarch/utils/NextcloudRepositoryWithNoCookies.kt diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt index 8a58329b9..e451ffeda 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/online/NextcloudTalkRepositoryImpl.kt @@ -26,8 +26,10 @@ import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.ConversationOverall import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.models.json.notifications.NotificationOverall import com.nextcloud.talk.models.json.participants.AddParticipantOverall import com.nextcloud.talk.models.json.participants.Participant +import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.models.json.push.PushRegistrationOverall import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall @@ -59,16 +61,16 @@ class NextcloudTalkRepositoryImpl(private val apiService: ApiService) : Nextclou ) } - override suspend fun getConversationForUser(userEntity: UserNgEntity, conversationToken: String): ConversationOverall { - return apiService.getConversation(userEntity.getCredentials(), conversationToken) + override suspend fun getConversationForUser(user: UserNgEntity, conversationToken: String): ConversationOverall { + return apiService.getConversation(user.getCredentials(), conversationToken) } - override suspend fun joinConversationForUser(userNgEntity: UserNgEntity, conversationToken: String, conversationPassword: String?): ConversationOverall { - return apiService.joinConversation(userNgEntity.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(userNgEntity.baseUrl, conversationToken), conversationPassword) + override suspend fun joinConversationForUser(user: UserNgEntity, conversationToken: String, conversationPassword: String?): ConversationOverall { + return apiService.joinConversation(user.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(user.baseUrl, conversationToken), conversationPassword) } - override suspend fun exitConversationForUser(userNgEntity: UserNgEntity, conversationToken: String): GenericOverall { - return apiService.exitConversation(userNgEntity.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(userNgEntity.baseUrl, conversationToken)) + override suspend fun exitConversationForUser(user: UserNgEntity, conversationToken: String): GenericOverall { + return apiService.exitConversation(user.getCredentials(), ApiUtils.getUrlForSettingMyselfAsActiveParticipant(user.baseUrl, conversationToken)) } override suspend fun getCapabilitiesForServer(server: String): CapabilitiesOverall { @@ -93,6 +95,14 @@ class NextcloudTalkRepositoryImpl(private val apiService: ApiService) : Nextclou } } + override suspend fun getNotificationForUser(user: UserNgEntity, notificationId: String): NotificationOverall { + return apiService.getNotification(user.getCredentials(), ApiUtils.getUrlForNotificationWithId(user.baseUrl, notificationId)) + } + + override suspend fun getPeersForCall(user: UserNgEntity, conversationToken: String): ParticipantsOverall { + return apiService.getPeersForCall(user.getCredentials(), ApiUtils.getUrlForCall(user.baseUrl, conversationToken)) + } + override suspend fun setPasswordForConversation(user: UserNgEntity, conversationToken: String, password: String): GenericOverall { return apiService.setPasswordForConversation(user.getCredentials(), ApiUtils.getUrlForPassword(user.baseUrl, conversationToken), password) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt index 85876de23..b7af3ed6e 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt @@ -27,13 +27,24 @@ import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.conversations.ConversationOverall import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.models.json.notifications.NotificationOverall import com.nextcloud.talk.models.json.participants.AddParticipantOverall +import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.models.json.push.PushRegistrationOverall import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall +import io.reactivex.Observable import retrofit2.http.* interface ApiService { + @GET + suspend fun getPeersForCall(@Header("Authorization") authorization: String, + @Url url: String): ParticipantsOverall + + @GET + suspend fun getNotification(@Header("Authorization") authorization: String, + @Url url: String): NotificationOverall + @FormUrlEncoded @PUT suspend fun setPasswordForConversation(@Header("Authorization") authorization: String, diff --git a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt index 7c7429785..1d05c5757 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt @@ -46,6 +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.NextcloudRepositoryWithNoCookies import com.nextcloud.talk.utils.LoggingUtils import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder @@ -87,10 +88,15 @@ val NetworkModule = module { single { createOkHttpClient(androidContext(), get(), get(), get(), get(), get(), get(), get()) } factory { createApiErrorHandler() } single { createNextcloudTalkRepository(get()) } + single { createNexcloudRepositoryWithNoCookies(get(), get())} single { createImageLoader(androidApplication(), get()) } } +fun createNexcloudRepositoryWithNoCookies(okHttpClient: OkHttpClient, retrofit: Retrofit): NextcloudRepositoryWithNoCookies { + return NextcloudRepositoryWithNoCookies(okHttpClient, retrofit) +} + fun createCookieManager(): CookieManager { val cookieManager = CookieManager() cookieManager.setCookiePolicy(ACCEPT_ALL) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt index 7792e1187..06382e032 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt @@ -51,9 +51,22 @@ val UseCasesModule = module { single { createCreateConversationUseCase(get(), get()) } single { createAddParticipantToConversationUseCase(get(), get()) } single { setConversationPasswordUseCase(get(), get()) } + factory { getPeersForCallUseCase(get(), get()) } + factory { getNotificationUseCase(get(), get()) } factory { createChatViewModelFactory(get(), get(), get(), get(), get(), get()) } } +fun getNotificationUseCase(nextcloudTalkRepository: NextcloudTalkRepository, + apiErrorHandler: ApiErrorHandler): GetNotificationUseCase { + return GetNotificationUseCase(nextcloudTalkRepository, apiErrorHandler) +} + +fun getPeersForCallUseCase(nextcloudTalkRepository: NextcloudTalkRepository, + apiErrorHandler: ApiErrorHandler): GetPeersForCallUseCase { + return GetPeersForCallUseCase(nextcloudTalkRepository, apiErrorHandler) +} + + fun setConversationPasswordUseCase(nextcloudTalkRepository: NextcloudTalkRepository, apiErrorHandler: ApiErrorHandler): SetConversationPasswordUseCase { return SetConversationPasswordUseCase(nextcloudTalkRepository, apiErrorHandler) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt index 87671a5ee..62a1fc45b 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/online/NextcloudTalkRepository.kt @@ -26,14 +26,18 @@ import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.ConversationOverall import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.models.json.notifications.NotificationOverall import com.nextcloud.talk.models.json.participants.AddParticipantOverall import com.nextcloud.talk.models.json.participants.Participant +import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.models.json.push.PushRegistrationOverall import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall import com.nextcloud.talk.newarch.local.models.UserNgEntity interface NextcloudTalkRepository { + suspend fun getNotificationForUser(user: UserNgEntity, notificationId: String): NotificationOverall + suspend fun getPeersForCall(user: UserNgEntity, conversationToken: String): ParticipantsOverall suspend fun setPasswordForConversation(user: UserNgEntity, conversationToken: String, password: String): GenericOverall suspend fun addParticipantToConversation(user: UserNgEntity, conversationToken: String, participantId: String, source: String): AddParticipantOverall suspend fun createConversationForUser(user: UserNgEntity, conversationType: Int, invite: String?, source: String?, conversationName: String?): ConversationOverall diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetNotificationUseCase.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetNotificationUseCase.kt new file mode 100644 index 000000000..e26fd575a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetNotificationUseCase.kt @@ -0,0 +1,39 @@ +/* + * + * * Nextcloud Talk application + * * + * * @author Mario Danic + * * Copyright (C) 2017-2020 Mario Danic + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see . + * + */ + +package com.nextcloud.talk.newarch.domain.usecases + +import com.nextcloud.talk.models.json.notifications.NotificationOverall +import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler +import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository +import com.nextcloud.talk.newarch.domain.usecases.base.UseCase +import org.koin.core.parameter.DefinitionParameters + +class GetNotificationUseCase constructor( + private val nextcloudTalkRepository: NextcloudTalkRepository, + apiErrorHandler: ApiErrorHandler? +) : UseCase(apiErrorHandler) { + override suspend fun run(params: Any?): NotificationOverall { + val definitionParameters = params as DefinitionParameters + return nextcloudTalkRepository.getNotificationForUser(definitionParameters[0], definitionParameters[0]) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetPeersForCallUseCase.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetPeersForCallUseCase.kt new file mode 100644 index 000000000..488f1a98a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/usecases/GetPeersForCallUseCase.kt @@ -0,0 +1,39 @@ +/* + * + * * Nextcloud Talk application + * * + * * @author Mario Danic + * * Copyright (C) 2017-2020 Mario Danic + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see . + * + */ + +package com.nextcloud.talk.newarch.domain.usecases + +import com.nextcloud.talk.models.json.participants.ParticipantsOverall +import com.nextcloud.talk.newarch.data.source.remote.ApiErrorHandler +import com.nextcloud.talk.newarch.domain.repository.online.NextcloudTalkRepository +import com.nextcloud.talk.newarch.domain.usecases.base.UseCase +import org.koin.core.parameter.DefinitionParameters + +class GetPeersForCallUseCase constructor( + private val nextcloudTalkRepository: NextcloudTalkRepository, + apiErrorHandler: ApiErrorHandler? +) : UseCase(apiErrorHandler) { + override suspend fun run(params: Any?): ParticipantsOverall { + val definitionParameters = params as DefinitionParameters + return nextcloudTalkRepository.getPeersForCall(definitionParameters[0], definitionParameters[1]) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkUtils.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkUtils.kt index 2ecbce59f..9015b91e6 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/NetworkUtils.kt @@ -33,6 +33,7 @@ import java.net.Proxy.Type import java.net.Proxy.Type.SOCKS class NetworkUtils { + class HeadersInterceptor : Interceptor { @Throws(IOException::class) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/NextcloudRepositoryWithNoCookies.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/NextcloudRepositoryWithNoCookies.kt new file mode 100644 index 000000000..c5e581df8 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/NextcloudRepositoryWithNoCookies.kt @@ -0,0 +1,44 @@ +/* + * + * * Nextcloud Talk application + * * + * * @author Mario Danic + * * Copyright (C) 2017-2020 Mario Danic + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see . + * + */ + +package com.nextcloud.talk.newarch.utils + +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 okhttp3.JavaNetCookieJar +import okhttp3.OkHttpClient +import org.koin.core.KoinComponent +import retrofit2.Retrofit +import java.net.CookieManager + +class NextcloudRepositoryWithNoCookies( + private val okHttpClient: OkHttpClient, + private val retrofit: Retrofit +) : KoinComponent { + fun getRepository(): NextcloudTalkRepository { + return NextcloudTalkRepositoryImpl(retrofit.newBuilder().client( + okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build()) + .build().create(ApiService::class.java)) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt index a797a564d..8be2d7890 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt @@ -91,7 +91,7 @@ object NotificationUtils { fun getNotificationChannelId(context: Context, channelName: String, channelDescription: String, enableLights: Boolean, - importance: Int, sound: Uri, audioAttributes: AudioAttributes, vibrationPattern: LongArray?, bypassDnd: Boolean, lockScreenVisibility: Integer?): String { + importance: Int, sound: Uri, audioAttributes: AudioAttributes, vibrationPattern: LongArray?, bypassDnd: Boolean, lockScreenVisibility: Int?): String { val channelId = Objects.hash(channelName, channelDescription, enableLights, importance, sound, audioAttributes, vibrationPattern, bypassDnd, lockScreenVisibility).toString() if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { @@ -106,7 +106,7 @@ object NotificationUtils { channelId: String, channelName: String, channelDescription: String, enableLights: Boolean, importance: Int, sound: Uri, audioAttributes: AudioAttributes, - vibrationPattern: LongArray?, bypassDnd: Boolean = false, lockScreenVisibility: Integer?) { + vibrationPattern: LongArray?, bypassDnd: Boolean = false, lockScreenVisibility: Int?) { val notificationManagerCompat = NotificationManagerCompat.from(context) if (notificationManagerCompat.getNotificationChannel(channelId) == null) {